package cn.edu.ctbu.dp01.api;
import cn.edu.ctbu.dp01.entity.Student;
import cn.edu.ctbu.dp01.constant.REnum;
import cn.edu.ctbu.dp01.exception.RException;
import cn.edu.ctbu.dp01.service.StudentService;
import cn.edu.ctbu.dp01.util.RUtil;
import cn.edu.ctbu.dp01.vo.QueryObj;
import cn.edu.ctbu.dp01.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/student")

public class StudentApiController {

    @Autowired
    private StudentService studentService;

    @GetMapping("/list")
    public R<List<Student>> findAll() {
        List<Student> students = studentService.getAll();
        return RUtil.success(students);
    }

    @GetMapping("/{id}")
    public R<Student> findByID(@PathVariable int id) {

        Student student = studentService.findById(id);
        return RUtil.success(student);
    }

    @GetMapping("/get/{name}")
    public R<List<Student>> findByName(@PathVariable String name) {

        List<Student> students = studentService.findByName(name);
        return RUtil.success(students);

    }

    @PostMapping("/add")
    public R<Student> add(Student student) {

        return RUtil.success(studentService.add(student));

    }

    @PutMapping("/update")
    public R<Student> update(Student student) {

        return RUtil.success(studentService.newupdate(student));
    }

    @DeleteMapping("/delete/{id}")
    public R delete(@PathVariable Integer id) {

        studentService.newdelete(id);
        return RUtil.success();
    }

    @GetMapping("/validateUser")
    public R validateSnoAndPassword(String sno, String password) throws Exception {

        return RUtil.success(studentService.validateUsernameAndPassword(sno, password));
    }
    @PostMapping("/getbypage")
    public R<Page<Student>> getByPage(@RequestBody QueryObj<Student> qObj){
        //id排序
        Sort sort = Sort.by(Sort.Direction.ASC,"id");
        Integer pageIndex = 0;
        Integer pageSize = 10;

        if (qObj == null) {
            //student对象空，调用分页
            Pageable pageable = PageRequest.of(pageIndex,pageSize,sort);
            Page<Student> students = studentService.getAll(pageable);
            return RUtil.success(students.getContent(), students.getTotalElements());
        } else {
            pageIndex = qObj.getPage()-1;
            pageSize = qObj.getLimit();

            if(qObj.getData() instanceof Student){
                Student student = (Student) qObj.getData();
                Pageable pageable = PageRequest.of(pageIndex,pageSize,sort);

                ExampleMatcher matcher = ExampleMatcher.matching()
                        .withMatcher("name", ExampleMatcher.GenericPropertyMatchers.contains())
                        .withIgnoreNullValues();

                Example<Student> example = Example.of(student, matcher);
                Page<Student> studentPage = studentService.getAll(example,pageable);
                return RUtil.success(studentPage.getContent(), studentPage.getTotalElements());
            }else{
                throw new RException(REnum.QUERY_ERR);
            }
        }
    }

    // 批量删除学生
    @DeleteMapping("/delete")
    public R deleteBatch(@RequestBody List<Integer> ids) {
        if (ids == null || ids.isEmpty()) {
            return RUtil.error(REnum.COMMON_ERR); // 返回错误如果ID列表无效
        }

        try {
            for (Integer id : ids) {
                studentService.newdelete(id); // 调用删除方法
            }
            return RUtil.success(); // 返回成功响应
        } catch (Exception e) {
            // 捕抓异常并返回错误响应
            return RUtil.error(1, "删除失败: " + e.getMessage()); // 包含详细的错误信息
        }
    }


}
